/*

 Copyright (C) SYSTAP, LLC DBA Blazegraph 2006-2016.  All rights reserved.

 Contact:
 SYSTAP, LLC DBA Blazegraph
 2501 Calvert ST NW #106
 Washington, DC 20008
 licenses@blazegraph.com

 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; version 2 of the License.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

 */
/*
 * Created on Dec 23, 2007
 */

package com.bigdata.io;

import com.bigdata.util.BytesUtil;

/**
 * Efficient absolute get/put operations on a slice of a byte[]. This class is
 * not thread-safe under mutation because the operations are not atomic.
 * Concurrent operations on the same region of the slice can reveal partial
 * updates.
 * 
 * @author <a href="mailto:thompsonbry@users.sourceforge.net">Bryan Thompson</a>
 * @version $Id$
 */
public class FixedByteArrayBuffer extends AbstractFixedByteArrayBuffer {

    /**
     * An empty slice.
     */
    public static final transient FixedByteArrayBuffer EMPTY = new FixedByteArrayBuffer(
            BytesUtil.EMPTY, 0, 0);
    
    /**
     * The backing byte[].
     */
    private final byte[] buf;

    final public byte[] array() {

        return buf;

    }

    /**
     * Create an instance backed by a fixed capacity byte[].
     * 
     * @param capacity
     *            The capacity of the backing byte[].
     */
    public FixedByteArrayBuffer(final int capacity) {

        super(0, capacity);

        this.buf = new byte[capacity];
        
    }

    /**
     * Create a slice of a byte[].
     * 
     * @param buf
     *            The byte[].
     * @param off
     *            The starting offset of the slice.
     * @param len
     *            The length of the slice.
     */
    public FixedByteArrayBuffer(final byte[] buf, final int off, final int len) {

        super(off, len);

        if (buf == null)
            throw new IllegalArgumentException("buf");

        if (off + len > buf.length)
            throw new IllegalArgumentException("off+len>buf.length");

        this.buf = buf;

    }

}
